(function () {
  function getQueryVariable(variable) {
    var query = window.location.search.substring(1),
      vars = query.split("&");

    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");

      if (pair[0] === variable) {
        return decodeURIComponent(pair[1].replace(/\+/g, '%20')).trim();
      }
    }
  }

  function getPreview(query, content, previewLength) {
    previewLength = previewLength || (content.length * 2);

    var parts = query.split(" "),
      match = content.toLowerCase().indexOf(query.toLowerCase()),
      matchLength = query.length,
      preview;

    // Find a relevant location in content
    for (var i = 0; i < parts.length; i++) {
      if (match >= 0) {
        break;
      }

      match = content.toLowerCase().indexOf(parts[i].toLowerCase());
      matchLength = parts[i].length;
    }

    // Create preview
    if (match >= 0) {
      var start = match - (previewLength / 2),
        end = start > 0 ? match + matchLength + (previewLength / 2) : previewLength;

      preview = content.substring(start, end).trim();

      if (start > 0) {
        preview = "..." + preview;
      }

      if (end < content.length) {
        preview = preview + "...";
      }

      // Highlight query parts
      preview = preview.replace(new RegExp("(" + parts.join("|") + ")", "gi"), "<strong>$1</strong>");
    } else {
      // Use start of content if no match found
      preview = content.substring(0, previewLength).trim() + (content.length > previewLength ? "..." : "");
    }

    return preview;
  }

  function displaySearchResults(results, query) {
    var searchResultsEl = document.getElementById("search-results"),
        searchProcessEl = document.getElementById("search-process");

    if (results.length) {
      var resultsHTML = "";
      results.forEach(function (result) {
        var item = window.data[result.ref],
          contentPreview = getPreview(query, item.content, 170),
          titlePreview = getPreview(query, item.title);

        resultsHTML += "<li><h4><a href='" + item.url.trim() + "'>" + titlePreview + "</a></h4><p><small>" + contentPreview + "</small></p></li>";
      });

      searchResultsEl.innerHTML = resultsHTML;
      searchProcessEl.innerText = "正在显示";
    } else {
      searchResultsEl.style.display = "none";
      searchProcessEl.innerText = "🤔 抱歉，并没有找到";
    }
  }

  window.index = lunr(function () {
    this.field("id");
    this.field("title", {boost: 10});
    //this.field("categories");
    //this.field("url");
    this.field("content");
  });

  var query = decodeURIComponent((getQueryVariable("q") || "").replace(/\+/g, "%20")),
    searchQueryContainerEl = document.getElementById("search-query-container"),
    searchQueryEl = document.getElementById("search-query");

  searchQueryEl.innerText = query;
  searchQueryContainerEl.style.display = "inline";

  for (var key in window.data) {
    window.index.add(window.data[key]);
  }

  displaySearchResults(window.index.search(query), query); // Hand the results off to be displayed
})();